home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / The World of Computer Software.iso / gs241j11.zip / KFUTIL.C < prev    next >
C/C++ Source or Header  |  1992-05-02  |  6KB  |  175 lines

  1. /*
  2.  * kfutil.c --- kanji font utilities
  3.  *
  4.  * Copyright (C) 1992 Norio Katayama.
  5.  * Apr. 23, 1992 Programmed by N.Katayama (katayama@nacsis.ac.jp)
  6.  */
  7.  
  8. #include "ghost.h"
  9. #include "oper.h"
  10. #include "errors.h"
  11. #include "gsmatrix.h"
  12.  
  13. /*
  14.  * Adjustment for Vertical Kanji
  15.  */
  16.  
  17. private int
  18. move(floatp dx, floatp dy, gs_rect *pbbox, gs_matrix *pmat)
  19. {
  20.     gs_matrix tmat;
  21.  
  22.     gs_make_translation(dx, dy, &tmat);
  23.     gs_matrix_multiply(pmat, &tmat, pmat);
  24.     gs_point_transform(pbbox->p.x, pbbox->p.y, &tmat, &pbbox->p);
  25.     gs_point_transform(pbbox->q.x, pbbox->q.y, &tmat, &pbbox->q);
  26.     return 0;
  27. }
  28.  
  29. private int
  30. roll(floatp xcl, floatp ycl, gs_rect *pbbox, gs_matrix *pmat)
  31. {
  32.     floatp lly, ury;
  33.     gs_matrix mat, tmat;
  34.     static gs_matrix rmat =
  35.         { constant_matrix_body(0.0, -1.0, 1.0, 0.0, 0.0, 0.0) };
  36.  
  37.     gs_make_translation(xcl - ycl, xcl + ycl, &tmat);
  38.     gs_matrix_multiply(&rmat, &tmat, &mat);
  39.  
  40.     gs_matrix_multiply(pmat, &mat, pmat);
  41.     gs_point_transform(pbbox->p.x, pbbox->p.y, &mat, &pbbox->p);
  42.     gs_point_transform(pbbox->q.x, pbbox->q.y, &mat, &pbbox->q);
  43.     lly = pbbox->q.y;
  44.     ury = pbbox->p.y;
  45.     pbbox->p.y = lly;
  46.     pbbox->q.y = ury;
  47.     return 0;
  48. }
  49.  
  50. private int
  51. mirror(floatp xcl, floatp ycl, gs_rect *pbbox, gs_matrix *pmat)
  52. {
  53.     gs_point temp;
  54.     gs_matrix mat, tmat;
  55.     static gs_matrix mmat =
  56.         { constant_matrix_body(0.0, -1.0, -1.0, 0.0, 0.0, 0.0) };
  57.  
  58.     gs_make_translation(xcl + ycl, xcl + ycl, &tmat);
  59.     gs_matrix_multiply(&mmat, &tmat, &mat);
  60.  
  61.     gs_matrix_multiply(pmat, &mat, pmat);
  62.     gs_point_transform(pbbox->p.x, pbbox->p.y, &mat, &pbbox->p);
  63.     gs_point_transform(pbbox->q.x, pbbox->q.y, &mat, &pbbox->q);
  64.     temp = pbbox->p;
  65.     pbbox->p = pbbox->q;
  66.     pbbox->q = temp;
  67.     return 0;
  68. }
  69.  
  70. #define MOVE(dx, dy)    move(dx, dy, pbbox, pmat)
  71. #define LEFT    move(- pbbox->p.x, 0.0, pbbox, pmat)
  72. #define RIGHT    move(xcl*2.0 - pbbox->q.x, 0.0, pbbox, pmat)
  73. #define TOP    move(0.0, ycl*2.0 - pbbox->q.y, pbbox, pmat)
  74. #define BOTTOM    move(0.0, - pbbox->p.y, pbbox, pmat);
  75. #define HCENTER    move(xcl - (pbbox->p.x + pbbox->q.x)/2.0, 0.0, pbbox, pmat)
  76. #define VCENTER    move(0.0, ycl - (pbbox->p.y + pbbox->q.y)/2.0, pbbox, pmat)
  77. #define ROLL    roll(xcl, ycl, pbbox, pmat)
  78. #define MIRROR    mirror(xcl, ycl, pbbox, pmat)
  79.  
  80. int
  81. kf_vmatrix(int jis_code, floatp xcl, floatp ycl, 
  82.        gs_rect *pbbox, gs_matrix *pmat)
  83. {
  84.     gs_make_identity(pmat);
  85.  
  86.     switch(jis_code) {
  87.  
  88.     case 0x2122: RIGHT; TOP; MOVE(-100.0, 0.0); break;
  89.     case 0x2123: RIGHT; TOP; MOVE(-100.0, 0.0); break;
  90.     case 0x2131: ROLL; RIGHT; VCENTER; break;
  91.     case 0x2132: ROLL; LEFT; VCENTER; break;
  92.     case 0x213c: MIRROR; HCENTER; VCENTER; break;
  93.     case 0x213d: ROLL; HCENTER; VCENTER; break;
  94.  
  95.     case 0x213e: ROLL; HCENTER; VCENTER; break;
  96.     case 0x2141: MIRROR; HCENTER; VCENTER; break;
  97.     case 0x2142: ROLL; HCENTER; VCENTER; break;
  98.     case 0x2143: ROLL; HCENTER; VCENTER; break;
  99.     case 0x2144: ROLL; HCENTER; VCENTER; break;
  100.     case 0x2145: ROLL; HCENTER; VCENTER; break;
  101.  
  102.     case 0x214a: ROLL; HCENTER; BOTTOM; break;
  103.     case 0x214b: ROLL; HCENTER; TOP; break;
  104.     case 0x214c: ROLL; HCENTER; BOTTOM; break;
  105.     case 0x214d: ROLL; HCENTER; TOP; break;
  106.     case 0x214e: ROLL; HCENTER; BOTTOM; break;
  107.     case 0x214f: ROLL; HCENTER; TOP; break;
  108.  
  109.     case 0x2150: ROLL; HCENTER; BOTTOM; break;
  110.     case 0x2151: ROLL; HCENTER; TOP; break;
  111.     case 0x2152: ROLL; HCENTER; BOTTOM; break;
  112.     case 0x2153: ROLL; HCENTER; TOP; break;
  113.     case 0x2154: ROLL; HCENTER; BOTTOM; break;
  114.     case 0x2155: ROLL; HCENTER; TOP; break;
  115.  
  116.     case 0x2156: ROLL; RIGHT; BOTTOM; break;
  117.     case 0x2157: ROLL; LEFT; TOP; break;
  118.     case 0x2158: ROLL; RIGHT; BOTTOM; break;
  119.     case 0x2159: ROLL; LEFT; TOP; break;
  120.     case 0x215a: ROLL; HCENTER; BOTTOM; break;
  121.     case 0x215b: ROLL; HCENTER; TOP; break;
  122.  
  123.     case 0x222e: ROLL; HCENTER; VCENTER; break;
  124.     case 0x2421: HCENTER; MOVE(100.0, 0.0); VCENTER; break;
  125.     case 0x2423: HCENTER; MOVE(100.0, 0.0); VCENTER; break;
  126.     case 0x2425: HCENTER; MOVE(100.0, 0.0); VCENTER; break;
  127.     case 0x2427: HCENTER; MOVE(100.0, 0.0); VCENTER; break;
  128.     case 0x2429: HCENTER; MOVE(100.0, 0.0); VCENTER; break;
  129.  
  130.     case 0x2443: HCENTER; MOVE(100.0, 0.0); VCENTER; break;
  131.     case 0x2463: HCENTER; MOVE(100.0, 0.0); VCENTER; break;
  132.     case 0x2465: HCENTER; MOVE(100.0, 0.0); VCENTER; break;
  133.     case 0x2467: HCENTER; MOVE(100.0, 0.0); VCENTER; break;
  134.     case 0x246e: HCENTER; MOVE(100.0, 0.0); VCENTER; break;
  135.     case 0x2521: HCENTER; MOVE(100.0, 0.0); VCENTER; break;
  136.  
  137.     case 0x2523: HCENTER; MOVE(100.0, 0.0); VCENTER; break;
  138.     case 0x2525: HCENTER; MOVE(100.0, 0.0); VCENTER; break;
  139.     case 0x2527: HCENTER; MOVE(100.0, 0.0); VCENTER; break;
  140.     case 0x2529: HCENTER; MOVE(100.0, 0.0); VCENTER; break;
  141.     case 0x2543: HCENTER; MOVE(100.0, 0.0); VCENTER; break;
  142.     case 0x2563: HCENTER; MOVE(100.0, 0.0); VCENTER; break;
  143.  
  144.     case 0x2565: HCENTER; MOVE(100.0, 0.0); VCENTER; break;
  145.     case 0x2567: HCENTER; MOVE(100.0, 0.0); VCENTER; break;
  146.     case 0x256e: HCENTER; MOVE(100.0, 0.0); VCENTER; break;
  147.     case 0x2575: HCENTER; MOVE(100.0, 0.0); VCENTER; break;
  148.     case 0x2576: HCENTER; MOVE(100.0, 0.0); VCENTER; break;
  149.     default: 
  150.         return 0;
  151.     };
  152.     return 1;
  153. }
  154.  
  155. int
  156. kf_is_vchar(int jis_code)
  157. {
  158.     switch(jis_code) {
  159.     case 0x2122: case 0x2123: case 0x2131: case 0x2132: case 0x213c: 
  160.     case 0x213d: case 0x213e: case 0x2141: case 0x2142: case 0x2143:
  161.     case 0x2144: case 0x2145: case 0x214a: case 0x214b: case 0x214c:
  162.     case 0x214d: case 0x214e: case 0x214f: case 0x2150: case 0x2151:
  163.     case 0x2152: case 0x2153: case 0x2154: case 0x2155: case 0x2156:
  164.     case 0x2157: case 0x2158: case 0x2159: case 0x215a: case 0x215b:
  165.     case 0x222e: case 0x2421: case 0x2423: case 0x2425: case 0x2427:
  166.     case 0x2429: case 0x2443: case 0x2463: case 0x2465: case 0x2467:
  167.     case 0x246e: case 0x2521: case 0x2523: case 0x2525: case 0x2527:
  168.     case 0x2529: case 0x2543: case 0x2563: case 0x2565: case 0x2567:
  169.     case 0x256e: case 0x2575: case 0x2576:
  170.         return 1;
  171.     default: 
  172.         return 0;
  173.     };
  174. }
  175.